package com.kun.companion.core.ui.tree;

import javafx.scene.control.TreeView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 高性能、低内存占用的可扩展树形视图基类
 * <p>
 * 扩展点说明:
 * 1. 数据模型扩展: 继承BaseTreeItem实现自定义数据节点，支持动态加载、图标和数据绑定
 * 2. 单元格渲染扩展: 重写updateItem方法实现自定义渲染逻辑，支持多状态样式
 * 3. 事件处理扩展: 通过setOnXxx系列方法添加事件监听，已内置双击展开/折叠逻辑
 * 4. 样式定制扩展: 通过CSS类名'tree-base'进行整体样式控制，支持伪类状态(:expanded, :leaf)
 * 5. 性能优化扩展: 实现lazyLoadChildren方法可实现子节点延迟加载，优化初始化性能
 * <p>
 * 运行逻辑:
 * 1. 采用观察者模式监听数据项变更
 * 2. 使用CSS样式与逻辑分离的渲染机制
 * 3. 通过Cell工厂实现虚拟滚动支持
 * 4. 内置内存回收机制自动清理无用节点
 *
 * @author gzc
 */
public class BaseTreeView<T> extends TreeView<T> {
    private static final Logger log = LoggerFactory.getLogger(BaseTreeView.class);

    private static final String defaultCSS =
            ".tree-base {\n" +
                    "   -fx-background-color: #f8f9fa;\n" +
                    "   -fx-border-color: #dee2e6;\n" +
                    "}\n" +
                    ".tree-cell {\n" +
                    "   -fx-padding: 3 5 3 5;\n" +
                    "}\n" +
                    ".tree-cell:expanded {\n" +
                    "   -fx-background-color: #e9ecef;\n" +
                    "}\n" +
                    ".tree-icon {\n" +
                    "   -fx-shape: \"M8 4a4 4 0 100 8 4 4 0 000-8z\";\n" +
                    "   -fx-background-color: #6c757d;\n" +
                    "}\n" +
                    ".tree-text {\n" +
                    "   -fx-text-fill: #212529;\n" +
                    "   -fx-font-family: \"Segoe UI\";\n" +
                    "}";

    public BaseTreeView() {
        initBaseComponents();
    }

    /**
     * 指定根节点创建树视图
     *
     * @param root 根节点实例
     */
    public BaseTreeView(BaseTreeItem<T> root) {
        super(root);
        initBaseComponents();
    }

    private void initBaseComponents() {
        // 配置基础样式
        getStyleClass().add("tree-base");
        getStylesheets().add("data:text/css;charset=UTF-8," + defaultCSS);
        // 设置默认Cell工厂
        setCellFactory(tv -> new BaseTreeCell<>());

        // 启用虚拟滚动优化
        setFixedCellSize(28);

        // 配置默认列宽策略
        setMinWidth(200);
        setPrefWidth(400);
        setMaxWidth(Double.MAX_VALUE);
    }


}